package com.aisile.student;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 排行榜代码测试类
 *
 * @Auther:yry
 * @Date:2024/6/28 0028
 * @VERSON:1.0
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class PHB_RedisZsetListDemo {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    // 一进入方法  直接查询对应缓存  如果有 直接返回即可  如果没有 查询mysql 然后存到redis中 并返回数据
    //一进入方法  直接查询对应redis集合数据  如果有 直接返回即可  如果没有  直接存到redis中 并返回数据
    @Test
    public void findAll() {
        // 使用zset结构  大key  分值=票数 值-用户  分值 值  分值 值
        Set<ZSetOperations.TypedTuple<String>> set = stringRedisTemplate.opsForZSet().reverseRangeWithScores("zsetList", 0, -1);
        if (set == null || set.size() == 0) {
            //当前没有这个集合 需要进行初始化
            for (int i = 0; i < 10; i++) {
                String name = "张三" + i;
                stringRedisTemplate.opsForZSet().add("zsetList", name, 0);
            }
        }
        set = stringRedisTemplate.opsForZSet().reverseRangeWithScores("zsetList", 0, -1);
        for (ZSetOperations.TypedTuple<String> item : set) {
            System.out.println("票数：" + item.getScore() + " ,姓名：" + item.getValue());
        }
    }


    @Test
    public void dianLikes() {
        // 每个用户的24小时的次数
        int mgyhdcs = 3;
        // 每个用户对应数据的次数
        int mgyhhbutongshujudecishu = 5;
        // 谁（当前用户李四：id 1） 给 谁（张三n）   6.一个用户 只能给一个数据 投票最多10次
        // 三个元素（ uid   张三3  次数）
        Integer uid = 1001;
        String name = "张三2";
        // 刷票过滤，同一用户（李四） 每天（24小时内）刷票不得超过10次。  string  key  value  key= 用户id  value 点赞次数
        String cs = stringRedisTemplate.opsForValue().get("dz_" + uid);
        // 当前用户的总次数
        String uid_cs = stringRedisTemplate.opsForValue().get(uid + "_dz_" + name);
        int i = 0;
        if(cs!=null){
            i = Integer.parseInt(cs);
        }else{
            i = 1;
        }

        if(i<mgyhdcs){
            if (uid_cs == null) {
                // 用户的总次数 初始化 1次
                stringRedisTemplate.opsForValue().set(uid + "_dz_" + name, "1");
            }else{
                // 满足次数要求  考虑 是否大于10次
                int y = Integer.parseInt(uid_cs);
                if (y < mgyhhbutongshujudecishu) {
                    y++;
                    stringRedisTemplate.opsForValue().set(uid + "_dz_" + name, y+"",0);
                }else{
                    // 证明超过10次 不能点击就提示
                    System.out.println(uid+"总次数！"+name+"不满足了");
                    return;
                }
            }
        }
        if (cs != null) {
            // 证明点过了
            if (i < mgyhdcs) {
                i++;
                // 同步redis 1. 票数+1  2.记录点赞次数
//                Long time =  stringRedisTemplate.getExpire("dz_" + uid,TimeUnit.MINUTES);
//                stringRedisTemplate.opsForValue().set("dz_" + uid, i + "", time, TimeUnit.MINUTES);
                stringRedisTemplate.opsForValue().set("dz_" + uid, i + "", 0);
            } else {
                // 证明超过10次 不能点击就提示
                System.out.println("当前用户当天24小时内 超过5次了");
                return;
            }
        } else {
            // 证明没有点过  进行初始化
            stringRedisTemplate.opsForValue().set("dz_" + uid, "1", 24, TimeUnit.HOURS);
        }
        // 同步票数
        stringRedisTemplate.opsForZSet().incrementScore("zsetList", name, 1);
        System.out.println("点赞成功！");
    }

}
